package com.vpx.dao;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class BaseDao {
    /**
     * 查询数据
     * @param sql 查询语句sql
     * @param params 参数 可以为null
     * @return
     * @throws Exception
     */
    public static List<Map<String,Object>> query(String sql, Object[] params){
        return SqlRunner.db().selectList(sql,params);
    }
    public static List<Map<String,Object>> query(String sql){
        return SqlRunner.db().selectList(sql,new Object[]{});
    }

    /**
     * 查询单列数据
     * @param sql       查询语句sql
     * @param params    参数
     * @return
     */
    public static List<Object> queryObjList(String sql, Object... params) {
        return SqlRunner.db().selectObjs(sql, params);
    }

    /**
     * 查询单行数据单个字段
     * @param sql       查询语句SQL
     * @param params    参数
     * @return
     */
    public static Object queryObj(String sql, Object... params) {
        return SqlRunner.db().selectObj(sql, params);
    }

    /**
     * 按照查询条件返回一个map集合
     * @param sql
     * @param params
     * @return
     */
    public static Map<String,Object> findUnique(String sql, Object[] params){
        return SqlRunner.db().selectOne(sql,params);
    }
    public static Map<String,Object> findUnique(String sql){
        return SqlRunner.db().selectOne(sql,new Object[]{});
    }

    /**
     * 插入语句
     * @param sql
     * @return
     */
    public static boolean insert(String sql) {
        return SqlRunner.db().insert(sql,null);
    }

    /**
     * insert("INSERT INTO demo ( id, tenant_id,sort_code) VALUES ( {0}, {1},{2})","1","2",3)
     * @param sql
     * @param args
     * @return
     */
    public static boolean insert(String sql,Object... args) {
        return SqlRunner.db().insert(sql,args);
    }
    /**
     * 更新SQL
     * @param sql
     * @return
     */
    public static boolean update(String sql) {
        return SqlRunner.db().update(sql,null);
    }

    /**
     * 更新SQL
     * @param sql   执行的SQL脚本
     * @param args  参数
     * @return
     */
    public static boolean update(String sql, Object... args) {
        return SqlRunner.db().update(sql,args);
    }
    public static boolean updateStrFormate(String sql, Object... params) {
        sql = String.format(sql,params);
        return SqlRunner.db().update(sql,null);
    }

    public static boolean insertStrFormate(String sql,Object... params) {
        sql = String.format(sql,params);
        return SqlRunner.db().insert(sql,null);
    }
    public static boolean deleteStrFormate(String delSql, Object... params) {
        delSql = String.format(delSql,params);
        return SqlRunner.db().delete(delSql, null);
    }
    public static List<Map<String,Object>> queryStrFormat(String querySql, Object... params){
        querySql = String.format(querySql,params);
        return SqlRunner.db().selectList(querySql,null);
    }
    public static Map<String,Object> findUniquequeryStrFormat(String querySql, Object... params){
        querySql = String.format(querySql,params);
        return SqlRunner.db().selectOne(querySql,null);
    }
    /**
     * 删除语句
     * @param delSql
     * @return
     */
    public static boolean delete(String delSql, Object... params) {
        return SqlRunner.db().delete(delSql, params);
    }

    public static long count(String sql, Object... params){
        return SqlRunner.db().selectCount(sql, params);
    }




    public static <T> T findOneObjStrFormat(String querySql, Class<T> resultType,Object... params) {
        querySql = String.format(querySql,params);
        Map<String,Object> result =  SqlRunner.db().selectOne(querySql,null);
        T resultVal = null;
        if(ObjectUtil.isNotEmpty(result)) {
            resultVal = Convert.convert(resultType,result);
        }
        return resultVal;
    }

    /**
     * 按照泛型返回单个数据
     * @param querySql
     * @param resultType Integer.class Long.class String.class
     * @param params 请求参数
     * @return
     * @param <T>
     */
    public static <T> T findOne(String querySql, Class<T> resultType,Object... params) {
        querySql = String.format(querySql,params);
        Map<String,Object> result =  SqlRunner.db().selectOne(querySql,null);
        T resultVal = null;
        if(ObjectUtil.isNotEmpty(result)) {
            Set<String> keys = result.keySet();
            for (String key : keys) {
                resultVal = Convert.convert(resultType,result.get(key));
                break;
            }
        }
        return resultVal;
    }
    /**
     * 按照泛型返回list数组
     * @param querySql 查询sql
     * @param resultType 需要返回的list中的泛型类型
     * @param params sql查询参数
     * @return
     * @param <T>
     */
    public static <T> List<T> findList(String querySql, Class<T> resultType,Object... params) {
        List<T> resultVals = new ArrayList<>();
        querySql = String.format(querySql,params);
        List<Map<String,Object>> result =  SqlRunner.db().selectList(querySql,null);
        if(ObjectUtil.isNotEmpty(result)) {

            //获取key
            Map<String,Object> resultMap = result.get(0);
            Set<String> keys = resultMap.keySet();
            String resultKey = "";
            for (String key : keys) {
                resultKey = key;
                break;
            }


            for(Map<String,Object> obj:result) {
                resultVals.add(Convert.convert(resultType,obj.get(resultKey)));
            }
        }
        return resultVals;
    }

    /**
     * 返回单个泛型对象
     * @param querySql
     * @param resultType
     * @param params
     * @return
     * @param <T>
     */
    public static <T> T findOneObject(String querySql, Class<T> resultType,Object... params) {
        querySql = String.format(querySql,params);
        Map<String,Object> result = SqlRunner.db().selectOne(querySql,null);
        T resultObj = null;
        if(result != null) {
            resultObj = Convert.convert(resultType,result);
        }
        return resultObj;
    }

    /**
     * 返回泛型对象list集合
     * @param querySql
     * @param resultType
     * @param params
     * @return
     * @param <T>
     */
    public static <T> List<T> findListObject(String querySql, Class<T> resultType,Object... params) {
        querySql = String.format(querySql,params);
        List<Map<String,Object>> results =  SqlRunner.db().selectList(querySql,null);
        List<T> resultObjs = new ArrayList<>();
        if(results != null) {
            results.forEach(result->{
                resultObjs.add(Convert.convert(resultType,result));
            });
        }
        return resultObjs;
    }

    /**
     * 返回单个map集合
     * @param querySql
     * @param params
     * @return
     */
    public static Map<String,Object> findOneMap(String querySql, Object... params){
        querySql = String.format(querySql,params);
        return SqlRunner.db().selectOne(querySql,null);
    }

    /**
     * 返回多个map集合
     * @param querySql
     * @param params
     * @return
     */
    public static List<Map<String,Object>> findListMap(String querySql, Object... params){
        querySql = String.format(querySql,params);
        return SqlRunner.db().selectList(querySql,null);
    }
}
